
# 从 qtpy 库导入 QtGui 模块，用于处理图形相关操作
from qtpy import QtGui
# 从 src 核心公共模块导入所有内容
from src.Core.Common import *


class AutoPanController(object):
    """
    AutoPanController 类用于控制自动平移功能。
    当指定位置超出给定矩形范围时，计算自动平移的偏移量。
    """
    def __init__(self, amount=0.1):
        """
        初始化 AutoPanController 实例。

        :param amount: 初始的平移量，默认为 0.1
        """
        super(AutoPanController, self).__init__()
        # 标记是否允许自动平移
        self.bAllow = False
        # 平移量
        self.amount = amount
        # 自动平移的偏移量，使用 QVector2D 存储 x 和 y 方向的偏移
        self.autoPanDelta = QtGui.QVector2D(0.0, 0.0)
        # 标记是否曾超出矩形范围
        self.beenOutside = False

    def Tick(self, rect, pos):
        """
        每帧检查位置是否超出矩形范围，并计算自动平移偏移量。

        :param rect: 用于检查的矩形区域
        :param pos: 需要检查的位置
        """
        if self.bAllow:
            # 检查位置的 x 坐标是否小于 0
            if pos.x() < 0:
                # 设置 x 方向的负平移偏移量
                self.autoPanDelta = QtGui.QVector2D(-self.amount, 0.0)
                self.beenOutside = True
                # 限制平移量在 0.0 到 25.0 之间
                self.amount = clamp(abs(pos.x()) * 0.1, 0.0, 25.0)
            # 检查位置的 x 坐标是否超出矩形宽度
            if pos.x() > rect.width():
                # 设置 x 方向的正平移偏移量
                self.autoPanDelta = QtGui.QVector2D(self.amount, 0.0)
                self.beenOutside = True
                # 限制平移量在 0.0 到 25.0 之间
                self.amount = clamp(abs(rect.width() - pos.x()) * 0.1, 0.0, 25.0)
            # 检查位置的 y 坐标是否小于 0
            if pos.y() < 0:
                # 设置 y 方向的负平移偏移量
                self.autoPanDelta = QtGui.QVector2D(0.0, -self.amount)
                self.beenOutside = True
                # 限制平移量在 0.0 到 25.0 之间
                self.amount = clamp(abs(pos.y()) * 0.1, 0.0, 25.0)
            # 检查位置的 y 坐标是否超出矩形高度
            if pos.y() > rect.height():
                # 设置 y 方向的正平移偏移量
                self.autoPanDelta = QtGui.QVector2D(0.0, self.amount)
                self.beenOutside = True
                # 限制平移量在 0.0 到 25.0 之间
                self.amount = clamp(abs(rect.height() - pos.y()) * 0.1, 0.0, 25.0)
            # 如果曾超出范围且当前位置回到矩形内，则重置状态
            if self.beenOutside and rect.contains(pos):
                self.reset()

    def getAmount(self):
        """
        获取当前的平移量。

        :return: 当前的平移量
        """
        return self.amount

    def getDelta(self):
        """
        获取当前的自动平移偏移量。

        :return: 自动平移偏移量，QVector2D 类型
        """
        return self.autoPanDelta

    def setAmount(self, amount):
        """
        设置平移量。

        :param amount: 要设置的平移量
        """
        self.amount = amount

    def start(self):
        """
        启动自动平移功能。
        """
        self.bAllow = True

    def isActive(self):
        """
        检查自动平移功能是否处于激活状态。

        :return: 如果激活返回 True，否则返回 False
        """
        return self.bAllow

    def stop(self):
        """
        停止自动平移功能，并重置状态。
        """
        self.bAllow = False
        self.reset()

    def reset(self):
        """
        重置自动平移控制器的状态。
        包括清除超出范围标记和重置平移偏移量。
        """
        self.beenOutside = False
        self.autoPanDelta = QtGui.QVector2D(0.0, 0.0)